/*
 * @Author       : wangzeyu 2309335887@qq.com
 * @Date         : 2023-06-23 15:45:16
 * @LastEditors  : WangZeYu
 * @LastEditTime : 2023-06-24 22:30:54
 * @FilePath     : \data-structure\queue.js
 * @Description  : 普通队列(先进先出)
 */

// 1.通过数组封装队列,但是数组中的是shift方法耗费性能，所以不建议用数组分装队列
class Queue1 {
    #items;
    constructor(arr) {
        this.#items = arr || []
    }
    // #items=[]
    enQueue(data) { //数据从队尾进入队列
        this.#items.push(data)
    }
    deQueue() { //数据从队头出队
        return this.#items.shift()
    }
    font() { //返回队头数据
        return this.#items[0]
    }
    isEmpty() { //判断队列是否为空
        return this.#items.length === 0
    }
    size() { //返回队列的大小
        return this.#items.length
    }
    clear() { //清空队列
        this.#items = []
    }
}
// 通过对象的方式封装队列 虽然分装麻烦但是性能较为优势
class Queue {
    #items = {}
    #lowCount = 0 //对头指针
    #count = 0 //items中元素个数

    enQueue(data) { //数据从队尾进入队列
        this.#items[this.#count] = data
        this.#count++
    }
    deQueue() { //数据从队头出队
        if (this.isEmpty()) {
            return undefined
        }
        let res = this.#items[this.#lowCount]
        delete this.#items[this.#lowCount]
        this.#lowCount++
        return res
    }
    font() { //返回队头数据
        return this.#items[this.#lowCount]
    }
    isEmpty() { //判断队列是否为空
        return this.size() === 0
    }
    size() { //返回队列的大小
        return this.#count - this.#lowCount
    }
    clear() { //清空队列
        this.#items = {}
        this.#lowCount = 0
        this.#lowCount = 0
    }
    toString() {
        let str = ''
        for (let i = this.#lowCount; i < this.#count; i++) {
            str += `${this.#items[i]} `
        }
    }
}

// 击鼓传花 第一个参数传入姓名数组，第二个参数传入敲击次数
function game(arr, num) {
    let queue = new Queue()
    for (let i = 0; i < arr.length; i++) {
        queue.enQueue(arr[i])
    }
    while (queue.size() > 1) {
        for (let i = 0; i < num; i++) {
            queue.enQueue(queue.deQueue())
        }
        console.log(queue.deQueue(),'淘汰')
    }
    console.log(queue.deQueue(),'获胜')
}

game(['小明', '小红', '小智', '小刚', '小霞'], 5)